import sys
import os
import logging
import json
from datetime import datetime
from typing import Dict, List, Any, Optional

# 添加项目根路径到 sys.path
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', '..'))

# 导入 MySQLUtil
from shared.utils.MySQLUtil import MySQLUtil

# 设置日志
logger = logging.getLogger(__name__)

def get_客观数据截止时间(
    project_id: int,
    questionnaire_ids: List[int],
    product_code: Optional[str] = None,
    project_code: Optional[str] = None,
    region_code: Optional[str] = None
) -> Dict[str, Any]:
    """
    客观数据截止时间 - 指标计算函数
    
    ## 指标说明
    该指标用于获取项目配置的客观数据采集截止时间，直接从项目表的obj_data_end_time字段获取。
    主要用于业务系统展示该项目的数据采集截止日期。
    
    ## Args
        project_id (int): 项目ID，用于查询项目配置信息
        questionnaire_ids (List[int]): 问卷ID集合，本指标中未使用但保留参数
        product_code (Optional[str]): 产品编码，本指标中未使用但保留参数
        project_code (Optional[str]): 项目编码，本指标中未使用但保留参数
        region_code (Optional[str]): 区域编码，本指标中未使用但保留参数
        
    ## 示例
    ### 输入
    ```json
    {
        "project_id": 5895,
        "questionnaire_ids": [11158, 11159]
    }
    ```
    
    ### 输出
    ```json
    {
        "success": true,
        "message": "ok", 
        "code": 0,
        "result": [
            {
                "calcVals": [
                    {
                        "val": [
                            {
                                "key": "default",
                                "val": "2024-08-31"
                            }
                        ]
                    }
                ]
            }
        ]
    }
    ```
    """
    logger.info(f"开始计算指标: 客观数据截止时间, 项目ID: {project_id}")
    
    try:
        db = MySQLUtil()  

        # 1. 查询项目配置信息
        project_sql = """
        SELECT obj_data_end_time 
        FROM dp_njc.client_item 
        WHERE id = %s
        """
        project_info = db.fetchone(project_sql, (project_id,))
        if not project_info:
            raise ValueError(f"未找到项目ID={project_id}的配置信息")

        obj_data_end_time = project_info['obj_data_end_time']
        
        logger.info(f"获取到客观数据截止时间: {obj_data_end_time}")

        # 2. 处理日期数据并构建返回数据
        formatted_date = None
        if obj_data_end_time:
            if isinstance(obj_data_end_time, str):
                # 如果是字符串，直接使用
                formatted_date = obj_data_end_time
            elif hasattr(obj_data_end_time, 'strftime'):
                # 如果是日期对象，格式化为字符串
                formatted_date = obj_data_end_time.strftime("%Y-%m-%d")
            else:
                # 其他类型转换为字符串
                formatted_date = str(obj_data_end_time)
        
        result_data = [
            {
                "key": "default",
                "val": formatted_date
            }
        ]

        logger.info(f"指标 '客观数据截止时间' 计算成功")
        return {
            "success": True,
            "message": "ok",
            "code": 0,
            "result": [{
                "calcVals": [{
                    "val": result_data
                }]
            }]
        }

    except Exception as e:
        logger.error(f"计算指标 '客观数据截止时间' 时发生错误: {str(e)}", exc_info=True)
        return {
            "success": False,
            "message": f"数据获取失败: 客观数据截止时间",
            "code": 500,
            "error": str(e)
        }